import express from "express";
import { PromptTemplate } from "@langchain/core/prompts";
import { tool } from "@langchain/core/tools";
import { createAIModel } from "../../config/ai.mjs";
import { ZhipuSDK } from "../../utils/ZhipuSDK.mjs";

const router = express.Router();

// 设置SSE响应头
const setupSSE = (res) => {
  res.setHeader("Content-Type", "text/event-stream");
  res.setHeader("Cache-Control", "no-cache");
  res.setHeader("Connection", "keep-alive");
  res.setHeader("Access-Control-Allow-Origin", "*");
};

// 处理流式数据
const handleStream = (res, chunk) => {
  if (chunk.content) {
    const data = {
      id: Date.now().toString(),
      content: chunk.content,
      type: "message",
    };
    res.write(`data: ${JSON.stringify(data)}\n\n`);
  }
};

// AI 分析专业路由
router.post("/analyze-major", async (req, res) => {
  console.log("AI 分析专业路由");
  try {
    const chatModel = createAIModel();

    // 设置SSE响应头
    setupSSE(res);

    const template = `请推荐当前热门专业，并分析专业的就业前景和发展方向：
    请从以下几个方面进行分析：
    1. 专业概况
    2. 就业方向
    3. 发展前景
    4. 建议和注意事项

    请用中文回答，回答要客观专业。`;

    const prompt = PromptTemplate.fromTemplate(template);
    const formattedPrompt = await prompt.format({});

    // 启动流式对话
    const stream = await chatModel.stream(formattedPrompt);

    // 心跳检测
    const heartbeat = setInterval(() => {
      res.write(": heartbeat\n\n");
    }, 30000);

    // 处理连接关闭
    res.on("close", () => {
      clearInterval(heartbeat);
      res.end();
    });

    try {
      // 处理流式响应
      for await (const chunk of stream) {
        handleStream(res, chunk);
      }
      // 发送完成信号
      res.write(`data: ${JSON.stringify({ type: "DONE" })}\n\n`);
      res.end();
    } catch (error) {
      console.error("Stream error:", error);
      res.write(
        `data: ${JSON.stringify({
          type: "error",
          error: error.message || "An error occurred during streaming",
        })}\n\n`
      );
      res.end();
    }
  } catch (error) {
    console.error("AI 分析错误:", error);
    if (!res.headersSent) {
      res.status(500).json({
        message: error.message,
        detail: error.response?.data || error,
      });
    } else {
      res.write(
        `data: ${JSON.stringify({
          type: "error",
          error: error.message || "An error occurred",
        })}\n\n`
      );
      res.end();
    }
  }
});

router.post("/major-analysis", async (req, res) => {
  const { major, region, city } = req.body;

  if (!major) {
    return res.status(400).json({ error: "Major is required" });
  }

  try {
    const ai = new ZhipuSDK({
      apiKey: process.env.ZHIPU_API_KEY,
    });

    const response = await ai.createCompletions({
      model: "glm-4-flash-250414",
      tools: [
        {
          type: "retrieval",
          retrieval: {
            knowledge_id: "1907314965451272192",
            prompt_template: "检索目标专业在选定地区的就业数据",
          },
        },
      ],
      messages: [
        {
          role: "system",
          content:
            "作为职业规划助手，你的任务是输出JSON格式的专业分析结果，需考虑地区和城市因素。输出模板和规范如下：",
        },
        {
          role: "system",
          content: `
            {
              "overview": "专业概述，50字以内",
              "careerPaths": ["至少4个技术岗位，按职级顺序"],
              "salaryRange": "薪资范围，格式'Xk-Yk'",
              "developmentPotential": "发展潜力评分，0-5之间",
              "studyTips": [
                {"title": "学习阶段", "content": "学习建议"}
              ],
              "relatedMajors": [
                {"name": "相关专业", "description": "专业描述", "similarity": "相似度数值"}
              ]
            }
          `,
        },
        {
          role: "system",
          content: `
            输出规范：
            1. 按模板格式输出所有字段。
            2. 职业路径包含至少4个技术岗位，按初级到高级排列。
            3. 薪资范围依据2024年一线城市数据。
            4. 发展潜力评分为0-5的整数或半整数。
            5. 学习建议包含3-5个阶段。
            6. 列出至少3个相关专业，相似度为0-100，差值需≥5，相似度越高，越相关。
            7. 使用双引号，不转义特殊字符，数值无引号。
            8. 仅输出JSON格式数据。
          `,
        },
        {
          role: "user",
          content: `
            分析${major}专业，输出符合规范的JSON结果，考虑地区：${region}和城市：${city}。
            请从知识库中检索目标专业在选定地区的就业数据
          `,
        },
      ],
      stream: false,
      response_format: {
        type: "json_object",
      },
    });

    // 获取 AI 返回的内容
    const content = response.choices[0].message.content;
    console.log("AI 原始输出:", content);

    // 尝试提取 JSON 部分
    let jsonStr = content;
    const jsonMatch = content.match(/\{[\s\S]*\}/);
    if (jsonMatch) {
      jsonStr = jsonMatch[0];
    }

    // 修复常见的 JSON 格式问题
    jsonStr = jsonStr
      // 修复单引号
      .replace(/'/g, '"')
      // 修复没有引号的键名
      .replace(/([{,]\s*)(\w+)(\s*:)/g, '$1"$2"$3')
      // 修复数值类型的引号
      .replace(/"(\d+(\.\d+)?)"/g, "$1")
      // 移除可能的注释
      .replace(/\/\/.*/g, "")
      .replace(/\/\*[\s\S]*?\*\//g, "")
      // 移除多余的逗号
      .replace(/,(\s*[}\]])/g, "$1");

    try {
      // 尝试解析 JSON
      const analysisData = JSON.parse(jsonStr);

      // 验证必要字段
      const requiredFields = [
        "overview",
        "careerPaths",
        "salaryRange",
        "developmentPotential",
        "studyTips",
        "relatedMajors",
      ];
      const missingFields = requiredFields.filter(
        (field) => !(field in analysisData)
      );

      if (missingFields.length > 0) {
        throw new Error(`缺少必要字段: ${missingFields.join(", ")}`);
      }

      // 确保数值类型正确
      analysisData.developmentPotential = Number(
        analysisData.developmentPotential
      );

      // 确保数组类型正确
      if (!Array.isArray(analysisData.careerPaths)) {
        analysisData.careerPaths = [];
      }
      if (!Array.isArray(analysisData.studyTips)) {
        analysisData.studyTips = [];
      }
      if (!Array.isArray(analysisData.relatedMajors)) {
        analysisData.relatedMajors = [];
      }

      res.json(analysisData);
    } catch (parseError) {
      console.error("JSON 解析错误:", parseError);
      console.error("修复后的 JSON 字符串:", jsonStr);
      throw new Error("AI 返回的数据格式不正确，无法解析为有效的 JSON");
    }
  } catch (error) {
    console.error("Analysis error:", error);
    res.status(500).json({
      error: "生成专业分析报告失败",
      details: error.message,
    });
  }
});

export default router;
